Obsidian プロジェクト別集計 2
#プロジェクト名 がついたタスクをプロジェクト別に集計し、ポップアップで結果表示
code:js
<%*
const completedTasks = tp.file.content.match(/- \x\.*/g);
if (!completedTasks) {
tR += "完了したタスクが見つかりませんでした。";
} else {
const projectData = {};
function parseTask(task) {
const timePattern = /(\d{1,2}:\d{2})-(\d{1,2}:\d{2})/;
const costPattern = /\\(\d+)/;
const projectPattern = /#(^\s+)/;
const timeMatch = task.match(timePattern);
const costMatch = task.match(costPattern);
const projectMatch = task.match(projectPattern);
let minutes = 0;
if (timeMatch) {
const start = timeMatch1;
const end = timeMatch2;
const startHour, startMinute = start.split(':').map(Number);
const endHour, endMinute = end.split(':').map(Number);
minutes = (endHour * 60 + endMinute) - (startHour * 60 + startMinute);
}
const cost = costMatch ? parseInt(costMatch1, 10) : 0;
const project = projectMatch ? projectMatch1 : 'その他';
return { project, minutes, cost };
}
for (const task of completedTasks) {
const { project, minutes, cost } = parseTask(task);
if (!projectDataproject) {
projectDataproject = { totalMinutes: 0, totalCost: 0 };
}
projectDataproject.totalMinutes += minutes;
projectDataproject.totalCost += cost;
}
const result = Object.entries(projectData).map((project, data) => {
const hours = (data.totalMinutes / 60).toFixed(1); // 分を時間に変換
return ${project}\t${hours}h;
}).join("\n");
function showModal(message) {
// モーダルのコンテナを作成
const modalContainer = document.createElement('div');
modalContainer.style.position = 'fixed';
modalContainer.style.top = '50%';
modalContainer.style.left = '50%';
modalContainer.style.transform = 'translate(-50%, -50%)';
modalContainer.style.padding = '20px';
modalContainer.style.backgroundColor = 'white';
modalContainer.style.border = '1px solid #ccc';
modalContainer.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.1)';
modalContainer.style.zIndex = '1000'; // 高いZインデックスで前面に表示
// テキストを表示
const text = document.createElement('p');
text.innerText = message;
modalContainer.appendChild(text);
// 閉じるボタンを作成
const closeButton = document.createElement('button');
closeButton.innerText = '閉じる';
closeButton.style.marginTop = '10px';
closeButton.addEventListener('click', () => {
document.body.removeChild(modalContainer);
});
modalContainer.appendChild(closeButton);
// モーダルをページに追加
document.body.appendChild(modalContainer);
}
// tR += result;
// new Notice(result)
showModal(result)
}
%>